class MayBe {
    static of (value) {
        return new MayBe(value)
    }

    constructor(value) {
        this._value = value
    }

    map (fn) {
        return this.isNothing() ? MayBe.of(null) : MayBe.of(fn(this._value));
    }

    isNothing() {
        return this._value == null;
    }
}

// let r = MayBe.of('Hello World')
//         .map(x => x.toUpperCase())

// let r = MayBe.of(undefined)
//         .map(x => x.toUpperCase())

let r = MayBe.of('hello world')
        .map(x => x.toUpperCase())
        .map(x => null)
        .map(x => x.split(' '))
console.log(r);
